<?php
if(!defined('BASE_DIR'))die('Cannot access the file !');
/**
 * -+-----------------------------------------
 * |PHP Framework
 * |Copyright (c) 2010 jinke.[iblue.cc]
 * |E-mail: mejinke@gmail.com
 * |Date:  2010-03-08
 * |Update: 2010-10-26
 * -+-----------------------------------------
 *
 * 系统视图基础类，主要用于输出页面
 * @author jinke
 */
class View extends Base
{


	/**
	 * 页面填充的数据
	 * @access private
	 * @var array
	 */
	private $_data = array();

	/**
	 * 当前控制器
	 * @access private
	 * @var string
	 */
	private $_controller = '';
	
	/**
	 * 控制器子目录名称
	 * @access private
	 * @var string
	 */
	private $_controller_folder = '';
	

	/**
	 * 当前动作Action
	 * @access private
	 * @var string
	 */
	private $_action = '';

	/**
	 * 模板编译名称
	 * @access private
	 * @var string
	 */
	private $compile_file = '';

	/**
	 * 模板目录开始目录
	 * @access private
	 * @var string
	 */
	private $template_folder = '';

	/**
	 * 模板风格名称 & 目录
	 * @access private
	 * @var string
	 */
	private $template_type = '';
	
	/**
	 * 使用的布局文件名称
	 * @access private
	 * @var string
	 */
	private  $layout = '';



	public function __construct()
	{
		$this->_controller = $this->getRouter()->getControllerName();
		$tep = explode('.', $this->_controller);
		if (count($tep)>1){
			$this->_controller = $tep[count($tep)-1];
			for ($i=0;$i<count($tep)-1;$i++){
				$this->_controller_folder.=$tep[$i].'.';
			}
		}
		
		$this->_action = $this->getRouter()->getActionName();

		$this->setTemplateType();
		$this->setTemplateDir();

		Debug::initClass('View.class.php');
	}


	/**
	 * 加添数据
	 * @access public
	 * @param string $key 键名
	 * @param mixed $value 键值
	 */
	public function add($key,$value)
	{
		$this->_data[$key] = $value;
	}


	/**
	 * 显示输出页面
	 * @param string $tpl_name 模板名称
	 * @param int $cache 缓存的时间，单位为分钟，默认为 0 即不开启缓存
	 * @param bool $echo 是否直接输出内容 默认为 True
	 * @param string $tpl_path 手动指定模板所在目录
	 * @param string $compile_dir 手动指定模板编译目录
	 * @param array $debug 记录出错点
	 */
	public function show($tpl_name = ''	,$cache = 0,$echo = true,$tpl_path = '',$compile_dir = '', $debug = null)
	{
		
		//模板完整路径
		if(empty($tpl_path))
			$tpl_file = $this->template_folder.$this->_controller_folder.$this->_controller.'/'.$tpl_name;
		else
			$tpl_file = BASE_DIR.$tpl_path.'/'.$tpl_name;

		//缓存目录
		$tpl_cache_dir = TEMP_DIR.'/cache/tpl/'.APP_NAME.'/'.$this->_controller.'/';
		
		//模板文件
		$tpl_file = str_replace('//', '/', $tpl_file);

		Debug::tpls($tpl_file);

		//缓存文件
		$tpl_cache_file	= $tpl_cache_dir.$tpl_name;

		$content = '';
		//加载HTML帮助函数库
		//Functions::FUN('html');

		//检测模板文件是否存在
		if(!file_exists($tpl_file))
			message_error('Load File','无法加载指定模板文件:'.$tpl_file,message_debug($debug));

		//开始编译模板
		$this->compile($tpl_file,$tpl_name,$compile_dir);
		$content = $this->obGetContents($this->_data, $this->compile_file);
		
		//是否使用布局模板
		if ($this->layout != '')
		{
			$this->add('layoutContentHtml', $content);
			$content = $this->obGetContents($this->_data, $this->compileLayoutTemplate());
		}
		
		//检查是否启用缓存
		if($cache != 0)
		{
			//创建缓存目录
			if(!is_dir($tpl_cache_dir))
			Files::mkdirs($tpl_cache_dir);
			$time_tag = '{##Create-Time:'.time().'_'.$cache.'##}';
			//写入缓存文件
			Files::write($tpl_cache_file,$time_tag.$content,'w+');
		}

		if ($echo === true)
			echo $content;
		else
			return $content;
	}


	/**
	 * 设置模板风格
	 * @return void
	 */
	private function setTemplateType()
	{
		$t = Config::get('action_view_type');
		if (isset($_GET['_style_']))
			$this->template_type = $_GET['_style_'].'/';
		else{
			
			if($t == '')
			{
				$this->template_type = 'default/';
			}
			else
			{
				$this->template_type = $t.'/';
			}
		}
	}


	/**
	 * 设置模板起始位置目录
	 * @return void
	 */
	private function setTemplateDir()
	{
		if(Config::get('action_view_dir')=='')
			$this->template_folder = APP_DIR.'views/'.$this->template_type;
		else
			$this->template_folder = BASE_DIR.Config::get('action_view_dir').'/'.$this->template_type.APP_NAME.'/';
	}


	/**
	 * 编译模板文件
	 * @access private
	 * @param string $tpl_path 模板路径
	 * @param string $tpl_name 模板名称
	 * @param string $compile_dir 手动指定编译目录
	 * @return void
	 */
	private function compile($tpl_file,$tpl_name,$compile_dir='')
	{

		 //设置编译目录
		 if ($compile_dir=='')
		 	$compile_dir = TEMP_DIR.'/compile/'.$this->template_type.APP_NAME.'/'.$this->_controller_folder.$this->_controller.'/';

		//创建目录
		Files::mkdirs($compile_dir);

		 //设置编译文件
		$this->compile_file	=	$compile_dir.'~'.$tpl_name.'.php';

		//清删除编译文件
		if(is_file($this->compile_file) && Config::get('step_debug') && Functions::GET('clear')=='true')
				@unlink($this->compile_file);

		if(is_file($this->compile_file) && !Config::get('compile'))
			return ;

		//开始编译文件
		$template = Functions::REC('FW_Template','Template');
		$template->compile_file	=	$this->compile_file;
		$template->compile($tpl_file);
	 }

	/**
	 * 设置表单提交令牌
	 * @access public
	 * @param int $sum 表单个数，令牌个数
	 * @return void
	 */
	public function setToken($sum	=	1)
	{
		$tep_array = array();
		//循环设置表单令牌
		for($i=1;$i<=$sum;$i++)
		{
			//令牌值
			$token_value= md5(APP_NAME.$this->_controller.'token~$%#'.$i.time());
			//添加变量
			$this->add('token_'.$i,$token_value);
			//封装数据
			$tep_array['token_'.$i]	= $token_value;
		}
		//储 存令牌值
		$this->_session->set(strtolower(APP_NAME.'_'.$this->_controller.'_'.$this->_action.'_token'),$tep_array);

	}
	
	
	
	/**
	 * 设置模板布局文件
	 * @access public
	 * @param string $layout
	 * @return bool
	 */
	public function setLayout($layout)
	{
		if(!is_string($layout)) return false;
		$cfg = Functions::getAppConfig(APP_NAME.'.common.layout_template');
		if ($cfg && isset($cfg[$layout]))
			$this->layout = $cfg[$layout];
	}
	
	
	/**
	 * 编译布局模板文件
	 * @access private
	 * @return string
	 */
	private function compileLayoutTemplate()
	{
		if ($this->layout == '') return false;
		$compile_file = TEMP_DIR.'compile/layout/'.$this->layout.'.php';
		
		//清删除编译文件
		if(is_file($compile_file) && Config::get('step_debug') && Functions::GET('clear')=='true')
			Files::del($compile_file);
		if(is_file($compile_file) && !Config::get('compile'))
			return $compile_file;
		
		$array = explode('/', $this->layout);
		$var = str_replace(array_pop($array), '', $this->layout);
		Files::mkdirs(TEMP_DIR.'compile/layout/'.$var);
		
		//开始编译文件
		$template = Functions::REC('FW_Template','Template');
		$template->compile_file	= $compile_file;
		$template->compile(BASE_DIR.$this->layout);
		
		return $compile_file;
	}
	
	
	/**
	 * 添加模板文件获取内存资料
	 * @access private
	 * @param array $data
	 * @param string $file
	 */
	private function obGetContents($data, $file)
	{
		$content = '';
		ob_start();
		if(is_array($data))
			extract($data,EXTR_PREFIX_SAME,'IBLUE');
		require_once $file;
		$content = ob_get_contents();
		ob_end_clean();
		return $content;
	}

}
?>